Racket 编程入门:0、介绍
在这本书中,探索如何使用 Racket(一种源于 Scheme 家族的编程语言,而后者源于 Lisp)和 DrRacket(一种图形化环境,允许充分利用 Racket 的所有特性)。这个生态系统的一个吸引人的特点是它配备大量的库,涵盖广泛的学科。开发人员将 Racket 描述为一种“包含电池”的系统。这使得它成为计算机科学和数学中各种主题的交互研究的理想平台。
考虑到 Racket 的 Lisp 血统,不应该忽略函数式编程,所有会在本文中探讨它。不过,Racket 并不是一招鲜吃遍天,也会在这个过程中探索命令式、面向对象和逻辑编程。同样,在计算机科学前沿,研究各种抽象计算器、数据结构和一些搜索算法,这些算法与解决趣味数学中一些问题有关。最后通过构建自己的计算器来完成本书,这需要使用正则表达式进行词法分析,使用拓展的 Backus-Naur 形式(EBNF)定义语法,并构建递归下降解析器。
Racket
Racket 的特点是具有广泛和良好的文档,其中包括:《简介:用图片介绍 Racket》、《Racket 入门》、《指南和 Racket 参考》。其他各种工具包和环境也有单独的文档。在 DrRacket 中,这些项目可以通过帮助菜单访问。
Racket 可用于各式各样的平台:Windows、Linux、macOS 和 Unix。它可以从 Racket 网站下载 https://download.racket-lang.org 。下载后,安装只需要在 Windows 上运行下载的可执行文件、在 macOS 运行 .dmg 文件、或在 Linux 上运行 shell 脚本。在攥写本文时,当前的版本时 7.8。本书中的示例可以在 7.0 或更高版本上运行。它们也可能会在较早的版本上运行,但是由于当前版本是免费提供的,所以实际上没必要这样做。当 DrRacket 环境首次启动时,会提示用户选择 Racket 语言。本书中的例子都是使用弹出对话框中的第一个选项(即“Racket 语言”)。
DrRacket 窗口提供一个定义窗口(图中显示的上部窗口),其中可以定义变量和函数,以及一个交互窗口(图中显示的下部窗口),Racket 代码可以交互执行。在这些窗口中,只需要按一个键就可以获得帮助。点击任何内置函数名并按 F1。
定义窗口包含健壮的交互式开发环境(IDE)的所有特性,比如语法高亮显示、变量重命名和集成调试器。
Racket 爱好者被亲切成为 Racketeers(很吸引人,不是吗?)。一旦有机会探索这个美妙的环境,并成为 Racketeer,不要感到惊讶。
这本书使用的惯例
DrRacket 支持多种编程和学习语言。在本书中,专门关注 Racket 的默认语言。因此,除非另有说明,否则所有定义的文件都应该如下开头
#lang racket
在定义部分输入的代码显示在如上所示的定义窗口中。
在交互窗口中输入的表达式以一个尖括号 > 作为前缀显示,如下所示。尖括号时 DrRacket 的输入提示符。输出显示没有尖括号。
> (+ 1 2 3) ;this is an input, the following is an output
6
偶尔会使用 DrRacket 支持的一些特殊符号,比如希腊字母(例如,可以使用 θ 作为角度的标识符)。这些符号在附录 B 中。输入这些符号的方法也在附录 B 中给出。如果手动输入这些例子,并且不想使用这些特殊的符号,只需要用你选择的名字替换:例如用 alpha 代替 α 。
定义窗口中输入程序的示例如下。
#lang racket
(define (piscis x y r b)
(let* ([y (- y r)]
[2r (* 2 r)]
[yi (sqrt (- (sqr r) (sqr x)))] ; y-intersection
[π pi]
➊ [ϕ (asin (/ yi r))]
➋ [θ (- π ϕ)]
➌ [path (new dc-path%)])
(send dc set-brush b)
➍ (send path move-to 0 (- yi))
➎ (send path arc (- x r) y 2r 2r θ (+ π ϕ))
➏ (send path arc (- (- x) r) y 2r 2r (- ϕ) ϕ)
➐ (send dc draw-path path)))
使用诸如 ➊ 的符号来突出代码中关键的部分。
这本书是给谁看的
虽然不需要事先了解 Racket、Lisp 或 Scheme,但有一些基本的编程知识也无妨,但这肯定不是必须的。数学的先决条件会有所不同。有些题目可能有点挑战性,但不会超过高中代数和三角学。可能会出现一两个定理,但是处理方法是非正式的。
关于这本书
如果你已经熟悉 Racket 语言,可以随意跳过(或者只是略读)前两章,因为它们这是这种语言的介绍。这些前期的章节绝不是一本关于 Racket 功能的百科全书。有抱负的读者应该查阅优秀的 Racket 文档以获得更详细的信息。下面是每一章内容的简要描述。
第一章:Racket 基础 给 Racket 新手介绍一些基本的 Racket 概念,这是本书其余部分所需要的。
第二章:算数和其他数值工具 描述 Racket 的大量数值数据类型:整数、有理数和复数(举几个例子)。本章使读者熟练地在 Racket 中使用这些数据。
第三章:函数基础 介绍 Racket 的多范式编程能力。本章向读者介绍函数式和命令式编程。最后一节介绍一些有趣的编程应用程序。
第四章:图表和集合论 介绍交互图形。大多数 IDE 都是纯文本的;DrRacket 具有在交互环境中生成图形输出的广泛能力。这一章告诉你如何做到这一点。
第五章:GUI:让用户感兴趣 展示如何构建在自己的窗口中运行的迷你图形应用程序。
第六章:数据 探讨在 Racket 中处理数据的各种方法。讨论如何在计算机的文件中读数据。讨论使用统计学和数据可视化分析数据的方法。
第七章:搜索答案 检索一些强大的搜索算法。这些算法将用于解决趣味数学中的各种问题和谜题。
第八章:逻辑编程 看看另一个强大的编程范例。探索如何使用 Racket 中类似 prolog 的逻辑编程库:Racklog。
第九章:计算机器 快速浏览各种抽象计算机器。这些简单机制是进入计算机科学中一些相当高深概念的途径。
第十章:TRAC:Racket 代数计算器 利用前几章开发的技能来构建一个独立的交互式命令行计算器。